package com.itheima.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * 采用纯注解的方式完成AOP操作
 */
@Aspect
public class AOPAdvice2 {
    @Pointcut("execution(* com.itheima.service.Impl.*.*(..))")
    public void pt(){}
    /*目标是在执行根据id删除之前执行当前检测功能*/
    public void checkId() {
        System.out.println("检测id值");
    }
    @Before("pt()")
    public void before() {
        System.out.println("前置before");
    }
@AfterReturning("pt()")
    public void afterReturning() {
        System.out.println("后置执行");
    }
@After("pt()")
    public void after() {
        System.out.println("最终执行");
    }
    @AfterThrowing("pt()")
    public void afterThrowing() {
        System.out.println("异常出现了");
    }
@Around("pt()")
public Object around(ProceedingJoinPoint proceedingJoinPoint){
    System.out.println("环绕通知");
    //在此要继续执行目标方法 参数proceedingJoinPoint就是执行的目标方法
   /* System.out.println(proceedingJoinPoint.getTarget());//获取目标方法所属类的对象
    System.out.println(proceedingJoinPoint.getSignature().getName());//获取目标方法的方法名
    System.out.println(proceedingJoinPoint.getArgs());*///获取方法的参数列表
    Object obj = null;
    try {
        //前置方法
        checkId();
        obj = proceedingJoinPoint.proceed();
        //后置方法
        afterReturning();
    } catch (Throwable throwable) {
        //异常通知
        afterThrowing();
        throwable.printStackTrace();
    }finally {
        //最终通知
        after();
    }
    return obj;
}
}
